﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Data.OleDb;
using System.Data;
using System.Data.SqlClient;
using CANO.Data.DAOs;

namespace CANO.WebSite.admin
{
    public partial class importContacts : System.Web.UI.Page
    {
        public DataTable dtResult
        {
            get
            {
                if (Session["dtResultOK"] != null)
                    return (DataTable)Session["dtResultOK"];
                else
                {
                    Session.Add("dtResultOK", new DataTable());
                        return (DataTable)Session["dtResultOK"];
                }
            }
            set 
            {
                Session["dtResultOK"] = value;
            }
        }

        public DataTable dtResultError
        {
            get
            {
                if (Session["dtResultError"] != null)
                    return (DataTable)Session["dtResultError"];
                else
                {
                    Session.Add("dtResultError", new DataTable());
                    return (DataTable)Session["dtResultError"];
                }
            }
            set
            {
                Session["dtResultError"] = value;
            }
        }


        protected void Page_Load(object sender, EventArgs e)
        {
            Session["currentModule"] = "Admin";
        }

        protected void UploadButton_Click(object sender, EventArgs e)
        {
            if (FileUploader.HasFile)
                try
                {
                    Session["dtResultError"] = null;
                    Session["dtResultOK"] = null;

                    //Validate if exist
                    if (!Directory.Exists(Server.MapPath("confirm//")))
                    {
                        Directory.CreateDirectory(Server.MapPath("confirm//"));
                    }

                    // Save CSV on Server
                    FileUploader.SaveAs(Server.MapPath("confirm//") + FileUploader.FileName);

                    
                    StreamReader sr = new StreamReader(Server.MapPath("confirm//") + FileUploader.FileName);

                    //Read
                    ReadCSV(Server.MapPath("confirm//") + FileUploader.FileName); // '*** Convert CSV to DataTable ***'


                  

                    gvResultOk.DataSource = dtResult;
                    gvResultOk.DataBind();

                    if (dtResult.Rows.Count == 0)
                    {
                        pnlMessageResultOkError.Visible = true;
                    }
                    else
                    {
                        pnlMessageResultOkOk.Visible = true;
                    }

                    gvResultError.DataSource = dtResultError;
                    gvResultError.DataBind();

                    if (dtResultError.Rows.Count > 0)
                    {
                        pnlMessageResultError.Visible = true;
                        pnlCausasError.Visible = true;

                    }

                    pnlUploader.Visible = false;
                    pnlResultados.Visible = true;

                }
                catch (Exception ex)
                {
                    lblMessage.Text = "<b> Hubo un error al leer el archivo. Por favor verificar el formato.</b>";
                }
            else
            {
                lblMessage.Text = "Selecciona un archivo.";
            }

        }

        private void ReadCSV(string filePath)
        {
            DataRow drResultOK;
            DataRow drResultError;

            dtResult.Columns.Add("Nombre");
            dtResult.Columns.Add("Apellido");
            dtResult.Columns.Add("Email");
            dtResult.Columns.Add("FechaOrigen");

            dtResultError.Columns.Add("Nombre");
            dtResultError.Columns.Add("Apellido");
            dtResultError.Columns.Add("Email");
            dtResultError.Columns.Add("FechaOrigen");

            StreamReader StrWer = new StreamReader(filePath, System.Text.Encoding.Default, true);
            string strLine = string.Empty;

            //  StrWer = File.OpenText(filePath);

            do
            {
                strLine = StrWer.ReadLine();
                if (strLine.Trim() != "")
                {
                    try
                    {
                        Data.DAOs.ContactoDAO contactToImport = new ContactoDAO();

                        int contactId = CreateContact(strLine, out contactToImport);

                        if (contactId == 0) //ToDo: Validate
                        {
                            drResultError = dtResultError.NewRow();

                            drResultError["Nombre"] = ParseStream(strLine, 1); // nombre
                            drResultError["Apellido"] = ParseStream(strLine, 2); // Apellido
                            drResultError["Email"] = ParseStream(strLine, 9); // email principal
                            drResultError["FechaOrigen"] = ValidateDateTime(ParseStream(strLine, 0));

                            dtResultError.Rows.Add(drResultError);
                        }
                        else
                        {
                            drResultOK = dtResult.NewRow();
                            drResultOK["Nombre"] = contactToImport.Nombre;
                            drResultOK["Apellido"] = contactToImport.Apellido;
                            drResultOK["Email"] = contactToImport.Email;
                            drResultOK["FechaOrigen"] = contactToImport.FechaOrigen.Value.ToShortDateString() + " " + contactToImport.FechaOrigen.Value.ToShortTimeString();

                            dtResult.Rows.Add(drResultOK);
                        }
                    }
                    catch (Exception ex)
                    {
                        throw;
                    }

                }
            } while (!StrWer.EndOfStream);
            StrWer.Close();
        }


        private string ParseStream(string StringToParse, int index)
        {
            var value = StringToParse.Split(new Char[] { ';' })[index];

            if (!string.IsNullOrEmpty(value) && value != " ")
                return StringToParse.Split(new Char[] { ';' })[index];
            else
                return "Sin Valor";
        }

        private int CreateContact(string strLine, out Data.DAOs.ContactoDAO contactToImport)
        {
            try
            {
                //Create ContactoDAO
                contactToImport = new Data.DAOs.ContactoDAO();

                //Fill DAO from stream line.
                contactToImport.FechaOrigen = ValidateDateTime(ParseStream(strLine, 0)); // Fecha Origen ToDo: ver q onda
                contactToImport.Nombre = ParseStream(strLine, 1); // nombre
                contactToImport.Apellido = ParseStream(strLine, 2); // Apellido
                contactToImport.Celular = ParseStream(strLine, 3); //Celular
                contactToImport.Email = ParseStream(strLine, 9); // email principal
                contactToImport.LugarInfluencia = this.GetLugarInfluencia(ParseStream(strLine, 10)); // lugar influencia
                contactToImport.TipoPropiedad = this.GetTipoPropiedad(ParseStream(strLine, 11)); // tipo propiedad
                contactToImport.Especialidad = this.GetEspecialidad(ParseStream(strLine, 12)); // especialidad
                contactToImport.Nacionalidad = this.GetNacionalidad(ParseStream(strLine, 13)); // nacionalidad
                contactToImport.IsPropietario = this.GetIsPropietario(ParseStream(strLine, 14)); // es propietario

                contactToImport.DireccionPersonal = ParseStream(strLine, 17); // direccion
                contactToImport.Dni = ParseStream(strLine, 18); //dni
                contactToImport.EmailSecundario = ParseStream(strLine, 19); // email secu
                contactToImport.FechaNacimiento = this.GetFechaNacimiento(ParseStream(strLine, 20)); // cumpleaños
                contactToImport.NombreConyuge = ParseStream(strLine, 21); //info familiar
                contactToImport.CuilCuit = ParseStream(strLine, 22); //cuit
                contactToImport.DireccionLaboral = ParseStream(strLine, 23); // direccion laboral
                contactToImport.PaginaWeb = ParseStream(strLine, 24); //web

                contactToImport.Profesion = this.GetProfesion(ParseStream(strLine, 26)); //profesion
                contactToImport.Notas = ParseStream(strLine, 27); // notas


                // Create Contact
                if (ContactoDAO.ValidateIfExist(contactToImport))
                    return 0;

                contactToImport.FechaOrigen = DateTime.Now;

                var contactNewId = ContactoDAO.create(contactToImport);

                // Telefonos Celuar Alternativo - ID 2
                var _celuarAlternativo = new ContactoTelefonosDAO();

                _celuarAlternativo.Contacto = contactNewId;
                _celuarAlternativo.Telefono = ParseStream(strLine, 5);
                _celuarAlternativo.TipoTelefonoID = 2;

                if(_celuarAlternativo.Telefono != "Sin Valor")
                    _celuarAlternativo.create();

                // Telefono Particular - ID 3
                var _telParticular = new ContactoTelefonosDAO();

                _telParticular.Contacto = contactNewId;
                _telParticular.Telefono = ParseStream(strLine, 6);
                _telParticular.TipoTelefonoID = 3;
                if (_telParticular.Telefono != "Sin Valor")
                 _telParticular.create();

                // Telefono Laboral - ID 4
                var _telLaboral = new ContactoTelefonosDAO();

                _telLaboral.Contacto = contactNewId;
                _telLaboral.Telefono = ParseStream(strLine, 7);
                _telLaboral.TipoTelefonoID = 4;
                if (_telLaboral.Telefono != "Sin Valor")
                    _telLaboral.create();

                // FAX - ID 5
                var _fax = new ContactoTelefonosDAO();

                _fax.Contacto = contactNewId;
                _fax.Telefono = ParseStream(strLine, 8);
                _fax.TipoTelefonoID = 5;
                if (_fax.Telefono != "Sin Valor")
                    _fax.create();

                // CELUAR 2 - ID 6
                var _celularDos = new ContactoTelefonosDAO();

                _celularDos.Contacto = contactNewId;
                _celularDos.Telefono = ParseStream(strLine, 4);
                _celularDos.TipoTelefonoID = 6;
                if (_celularDos.Telefono != "Sin Valor")
                 _celularDos.create();

                //Observaciones
                new ObservacionesDAO()
                {
                    //ToDo: validar el usuario created by, fecha de observacion
                    Contacto = contactNewId,
                    FechaObservacion = DateTime.Now,
                    FechaObservacionShort = DateTime.Now.ToShortDateString(),
                    Observacion = ParseStream(strLine, 15),
                    UsuarioCreatedBy = 1
                }.create();


                // Asignaciones
                var usuariosToAsign = ParseStream(strLine, 16).Split(new Char[] { (';'), (',') });

                List<int> listIds = new List<int>();

                foreach (var item in usuariosToAsign)
	                {
                        if (!string.IsNullOrEmpty(item) && item != " " && item != "Sin Valor")
                        {
                            var id = new UsuarioDAO().GetUserIDByUser(item);
                            listIds.Add(id);
                        }
	                }

                foreach (var id in listIds)
                {
                        new AsignacionesDAO() { Contacto = contactNewId, Usuario = Convert.ToInt32(id) }.create();
                }

                return contactNewId;
            }
            catch (Exception)
            {
                contactToImport = new Data.DAOs.ContactoDAO();
                return 0;
            }
        }

        private int? GetProfesion(string profesionToValidate)
        {
            if (!string.IsNullOrEmpty(profesionToValidate))
            {
                var profesionList = Data.DAOs.ProfesionDAO.GetProfesionByName(profesionToValidate);
                if (profesionList.Count() == 0)
                {
                    return ProfesionDAO.createNew(profesionToValidate);
                }
                else
                {
                    return ProfesionDAO.GetIdByName(profesionToValidate);
                }
            }
            return null;
        }

        private int? GetIsPropietario(string isPropietario)
        {
            if (string.IsNullOrEmpty(isPropietario))
                return 0;
            else if (isPropietario.ToLower() == "si" || isPropietario.ToLower() == "yes" || isPropietario.ToLower() == "s")
                return 1;
            else
                return 0;
        }

        private int? GetNacionalidad(string nacionalidadToValidate)
        {
            if (!string.IsNullOrEmpty(nacionalidadToValidate))
            {
                var nacionalidadList = Data.DAOs.NacionalidadDAO.GetNacionalidadByName(nacionalidadToValidate);
                if (nacionalidadList.Count() == 0)
                {
                    return NacionalidadDAO.createNew(nacionalidadToValidate);
                }
                else
                {
                    return NacionalidadDAO.GetIdByName(nacionalidadToValidate);
                }
            }
            return null;
        }

        private int? GetEspecialidad(string especialidadToValidate)
        {
            if (!string.IsNullOrEmpty(especialidadToValidate))
            {
                var especialidadList = Data.DAOs.EspecialidadDAO.GetEspecialidadByName(especialidadToValidate);
                if (especialidadList.Count() == 0)
                {
                    return EspecialidadDAO.createNew(especialidadToValidate);
                }
                else
                {
                    return EspecialidadDAO.GetIdByName(especialidadToValidate);
                }
            }
            return null;
        }

        private int? GetTipoPropiedad(string propiedadToValidate)
        {
            if (!string.IsNullOrEmpty(propiedadToValidate))
            {
                var propiedadList = Data.DAOs.TipoPropiedadDAO.getAll().Select(x => x.TipoPropiedad.ToLower().Equals(propiedadToValidate));
                if (propiedadList.Count() == 0)
                {
                    return TipoPropiedadDAO.createNew(propiedadToValidate);
                }
                else
                {
                    return TipoPropiedadDAO.GetIdByName(propiedadToValidate);
                }
            }
            return null;
        }

        private int? GetLugarInfluencia(string lugarInfluencia)
        {
            if (!string.IsNullOrEmpty(lugarInfluencia))
            {
                var lugarInfluenciaList = Data.DAOs.LugarInfluenciaDAO.getAll();

                foreach (var item in lugarInfluenciaList)
                {
                    if (item.LugarInfluencia == lugarInfluencia.ToLower())
                        return LugarInfluenciaDAO.GetIdByName(lugarInfluencia);
                }
                return LugarInfluenciaDAO.createNew(lugarInfluencia);
            }
            return null;
        }

        private DateTime? ValidateDateTime(string dateToValidate)
        {
            try
            {
                if (!string.IsNullOrEmpty(dateToValidate))
                    return Convert.ToDateTime(dateToValidate);
                else if (dateToValidate == "Sin Valor")
                    return DateTime.Now;
                else
                    return null;
            }
            catch (Exception)
            {
                return DateTime.Now;
            }

        }

        private DateTime? GetFechaNacimiento(string valueFechaNac)
        {
            if (!string.IsNullOrEmpty(valueFechaNac))
            {
                return Convert.ToDateTime(valueFechaNac);
            }
            else
                return null;
        }

        protected void gvResultOk_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvResultOk.PageIndex = e.NewPageIndex;
            gvResultOk.DataSource = dtResult;
            gvResultOk.DataBind();
        }

        protected void gvResultError_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvResultError.PageIndex = e.NewPageIndex;
            gvResultError.DataSource = dtResultError;
            gvResultError.DataBind();       

        }

    }

}
